λΉλ νμ΄νλΌμΈ λ΄ μμ° μ²λ¦¬ λ° μ΅μ ν μ’ ν© κ°μ΄λλ‘ μ΅κ³ μ νλ‘ νΈμλ μ±λ₯μ λ¬μ±νμΈμ. κΈλ‘λ² μΉμ¬μ΄νΈλ₯Ό μν νμ κΈ°μ μ λ°°μ°μΈμ.
νλ‘ νΈμλ λΉλ νμ΄νλΌμΈ: κΈλ‘λ² μ±λ₯μ μν μμ° μ²λ¦¬ λ° μ΅μ ν λ§μ€ν°νκΈ°
μ€λλ μνΈ μ°κ²°λ λμ§νΈ νκ²½μμ νλ‘ νΈμλ μ ν리μΌμ΄μ μ μ±λ₯μ 무μλ³΄λ€ μ€μν©λλ€. λλ¦° μΉμ¬μ΄νΈλ μ¬μ©μ μ΄ν, μ νμ¨ κ°μ, λΈλλ μ΄λ―Έμ§ μμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ°μ΄λ νλ‘ νΈμλ μ±λ₯μ λ¬μ±νλ ν΅μ¬μλ μ μ μλκ³ μ΅μ νλ λΉλ νμ΄νλΌμΈμ΄ μμ΅λλ€. μ΄ νμ΄νλΌμΈμ μμ μμ€ μ½λμ μμ°μ μ¬μ©μμ λΈλΌμ°μ μ μ λ¬λλ μΈλ ¨λκ³ ν¨μ¨μ μΈ νμΌλ‘ λ³ννλ μμ§μ λλ€.
μ΄ μ’ ν© κ°μ΄λμμλ νλ‘ νΈμλ λΉλ νμ΄νλΌμΈ λ΄μμ μμ° μ²λ¦¬ λ° μ΅μ νμ μ€μν μΈ‘λ©΄μ μ¬μΈ΅μ μΌλ‘ λ€λ£Ήλλ€. μ°λ¦¬λ μΉ μ ν리μΌμ΄μ μ΄ λ€μνκ³ μ μΈκ³μ μΈ μ¬μ©μμκ² λ²κ°μ²λΌ λΉ λ₯Έ κ²½νμ μ 곡ν μ μλλ‘ νμ κΈ°μ , μ΅μ λꡬ λ° λͺ¨λ² μ¬λ‘λ₯Ό νꡬν κ²μ λλ€.
νλ‘ νΈμλ λΉλ νμ΄νλΌμΈμ μ€μν μν
νλ‘ νΈμλ λΉλ νμ΄νλΌμΈμ μ κ΅ν 곡μ₯μ΄λΌκ³ μμν΄ λ³΄μΈμ. μμμ¬, μ¦ HTML, CSS, JavaScript, μ΄λ―Έμ§, κΈκΌ΄ λ° κΈ°ν μμ°μ΄ νμͺ½ λμΌλ‘ λ€μ΄κ°λλ€. μ μ€νκ² μ‘°μ¨λ μΌλ ¨μ νλ‘μΈμ€λ₯Ό ν΅ν΄ μ΄λ¬ν μμ¬λ μ΅μ’ μ¬μ©μκ° μλΉν μ€λΉκ° λ μ΅μ’ μ νμΌλ‘ μ μ , 쑰립 λ° ν¬μ₯λ©λλ€. μ΄ μΈμ¬ν κ³Όμ μ΄ μλ€λ©΄ μΉμ¬μ΄νΈλ μ΅μ νλμ§ μμ λΆνΌκ° ν° νμΌ λͺ¨μμ΄ λμ΄ λ‘λ μκ°μ΄ ν¨μ¬ λλ €μ§ κ²μ λλ€.
κ²¬κ³ ν λΉλ νμ΄νλΌμΈμ λ€μκ³Ό κ°μ λͺ κ°μ§ μ£Όμ λͺ©νλ₯Ό ν΄κ²°ν©λλ€:
- μ½λ λ³ν: μ΅μ JavaScript ꡬ문(ES6+)μ λ λμ λ²μμ λΈλΌμ°μ μ νΈνλλ μ΄μ λ²μ μΌλ‘ λ³νν©λλ€.
- μμ° λ²λ€λ§: μ¬λ¬ JavaScript λλ CSS νμΌμ λ μ κ³ ν° νμΌλ‘ κ·Έλ£Ήννμ¬ HTTP μμ² μλ₯Ό μ€μ λλ€.
- μ½λ μ΅μν: JavaScript, CSS λ° HTMLμμ λΆνμν λ¬Έμ(곡백, μ£Όμ)λ₯Ό μ κ±°νμ¬ νμΌ ν¬κΈ°λ₯Ό μ€μ λλ€.
- μμ° μ΅μ ν: μ΄λ―Έμ§ μμΆ, κΈκΌ΄ μ΅μ ν, CSS/JavaScript μ μ²λ¦¬λ₯Ό ν΅ν΄ νμΌ ν¬κΈ°λ₯Ό λμ± μ€μ΄κ³ μ λ¬μ κ°μ ν©λλ€.
- μ½λ λΆν : λκ·λͺ¨ μ½λλ² μ΄μ€λ₯Ό νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλμ΄ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ κ°μ ν©λλ€.
- μΊμ 무λ ₯ν(Cache Busting): μ¬μ©μκ° μ λ°μ΄νΈ ν νμ μ΅μ λ²μ μ μμ°μ λ°μ μ μλλ‘ νλ μ λ΅μ ꡬνν©λλ€.
- νΈλμ€νμΌλ§: μλ‘μ΄ μΈμ΄ κΈ°λ₯μ λ λ리 μ§μλλ κΈ°λ₯μΌλ‘ λ³νν©λλ€(μ: TypeScriptλ₯Ό JavaScriptλ‘).
μ΄λ¬ν μμ μ μλνν¨μΌλ‘μ¨ λΉλ νμ΄νλΌμΈμ νλ‘ νΈμλ μ λ¬μ μΌκ΄μ±, ν¨μ¨μ± λ° λμ μμ€μ νμ§μ 보μ₯ν©λλ€.
μ£Όμ μμ° μ²λ¦¬ λ° μ΅μ ν κΈ°μ
ν¨κ³Όμ μΈ νλ‘ νΈμλ λΉλ νμ΄νλΌμΈμ ꡬλνλ ν΅μ¬ κΈ°μ μ μ΄ν΄λ³΄κ² μ΅λλ€. μ΄κ²λ€μ κ³ μ±λ₯ μΉ μ ν리μΌμ΄μ μ λ§λ€κΈ° μν κ΅¬μ± μμμ λλ€.
1. JavaScript μ²λ¦¬ λ° μ΅μ ν
JavaScriptλ μ’ μ’ νλ‘ νΈμλ μ ν리μΌμ΄μ μμ κ°μ₯ λ¬΄κ±°μ΄ κ΅¬μ± μμμ λλ€. μ λ¬μ μ΅μ ννλ κ²μ΄ μ€μν©λλ€.
- λ²λ€λ§: Webpack, Rollup, Parcelκ³Ό κ°μ λꡬλ JavaScript λͺ¨λμ λ²λ€λ§νλ λ° νμμ μ λλ€. μ΄λ€μ μμ‘΄μ± κ·Έλνλ₯Ό λΆμνκ³ μ΅μ νλ λ²λ€μ μμ±ν©λλ€. μλ₯Ό λ€μ΄, Webpackμ νμν λλ§ λ‘λλλ μ¬λ¬ κ°μ μμ λ²λ€(μ½λ λΆν )μ μμ±ν μ μμΌλ©°, μ΄ κΈ°μ μ μ μΈκ³μ μΌλ‘ λ€μν λ€νΈμν¬ μ‘°κ±΄μ κ°μ§ μ¬μ©μλ₯Ό λμμΌλ‘ νλ λκ·λͺ¨ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μ νΉν μ μ©ν©λλ€.
- μ΅μν: Terser(JavaScriptμ©) λ° CSSNano(CSSμ©)μ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ½λμμ λͺ¨λ λΉνμ λ¬Έμλ₯Ό μ κ±°νλ λ° μ¬μ©λ©λλ€. μ΄λ νμΌ ν¬κΈ°λ₯Ό ν¬κ² μ€μ λλ€. μΈν°λ· μ°κ²°μ΄ λλ¦° μΈλμ μ골 μ§μμμ μ¬μ΄νΈμ μ μνλ μ¬μ©μμ λν μν₯μ μκ°ν΄ 보μΈμ. μ μ½λ λͺ¨λ ν¬λ‘λ°μ΄νΈκ° μ€μ§μ μΈ μ°¨μ΄λ₯Ό λ§λλλ€.
- νΈλμ€νμΌλ§: Babelμ μ΅μ JavaScript(ES6+)λ₯Ό μ΄μ λ²μ (ES5)μΌλ‘ νΈλμ€νμΌλ§νλ μ¬μ€μμ νμ€μ λλ€. μ΄λ μ΅μ ECMAScript κΈ°λ₯μ μμ§ μ§μνμ§ μλ λΈλΌμ°μ μμλ μ ν리μΌμ΄μ μ΄ μννκ² μ€νλλλ‘ λ³΄μ₯ν©λλ€. λΈλΌμ°μ μ±νλ₯ μ΄ μ§μ λ° μΈκ΅¬ ν΅κ³μ λ°λΌ ν¬κ² λ€λ₯΄κΈ° λλ¬Έμ κΈλ‘λ² μ¬μ©μλ₯Ό μν΄μλ μ΄κ²μ΄ νμμ μ λλ€.
- νΈλ¦¬ μμ΄νΉ(Tree Shaking): μ¬μ©λμ§ μλ μ½λλ₯Ό JavaScript λ²λ€μμ μ κ±°νλ κ³Όμ μ λλ€. Webpack λ° Rollupκ³Ό κ°μ λꡬλ μ½λκ° ES λͺ¨λμ μ¬μ©νμ¬ κ΅¬μ‘°νλ κ²½μ° νΈλ¦¬ μμ΄νΉμ μνν©λλ€. μ΄λ μ ν리μΌμ΄μ μ΄ μ€μ λ‘ μ¬μ©νλ μ½λλ§ μ¬μ©μμκ² μ λ¬λλλ‘ λ³΄μ₯νλ©°, νμ΄λ‘λ ν¬κΈ°λ₯Ό μ€μ΄λ λ° μ€μν μ΅μ νμ λλ€.
- μ½λ λΆν : μ΄ κΈ°μ μ JavaScriptλ₯Ό λ μκ³ κ΄λ¦¬ κ°λ₯ν μ²ν¬λ‘ λλλ κ²μ ν¬ν¨ν©λλ€. μ΄λ¬ν μ²ν¬λ λΉλκΈ°μ μΌλ‘ λλ νμμ λ°λΌ λ‘λλ μ μμ΅λλ€. React(`React.lazy` λ° `Suspense` μ¬μ©), Vue.js, Angularμ κ°μ νλ μμν¬λ μ½λ λΆν μ μν λ΄μ₯ μ§μ λλ ν¨ν΄μ μ 곡ν©λλ€. μ΄λ κΈ°λ₯μ΄ λ§μ μ ν리μΌμ΄μ μ νΉν ν¨κ³Όμ μ λλ€. νΈμ£Όμ μ¬μ©μλ μ 체 μ ν리μΌμ΄μ μ JavaScriptκ° μλ μμ μ μΈμ κ³Ό κ΄λ ¨λ κΈ°λ₯λ§ λ‘λνλ©΄ λ μ μμ΅λλ€.
2. CSS μ²λ¦¬ λ° μ΅μ ν
ν¨μ¨μ μΈ CSS μ λ¬μ λ λλ§ μλμ μκ°μ μΌκ΄μ±μ λ§€μ° μ€μν©λλ€.
- λ²λ€λ§ λ° μ΅μν: JavaScriptμ λ§μ°¬κ°μ§λ‘ CSS νμΌλ ν¬κΈ°μ μμ² μλ₯Ό μ€μ΄κΈ° μν΄ λ²λ€λ§λκ³ μ΅μνλ©λλ€.
- μλ μ λμ¬ μΆκ°(Autoprefixing): PostCSSμ Autoprefixer νλ¬κ·ΈμΈκ³Ό κ°μ λꡬλ λμ λΈλΌμ°μ λͺ©λ‘μ κΈ°λ°μΌλ‘ CSS μμ±μ λ²€λ μ λμ¬(μ: `-webkit-`, `-moz-`)λ₯Ό μλμΌλ‘ μΆκ°ν©λλ€. μ΄λ₯Ό ν΅ν΄ μλ κ°μ μμ΄λ λ€μν λΈλΌμ°μ μμ μ€νμΌμ΄ μ¬λ°λ₯΄κ² λ λλ§λλλ‘ λ³΄μ₯νλ©°, κ΅μ νΈνμ±μ μν μ€μν λ¨κ³μ λλ€.
- Sass/Less/Stylus μ²λ¦¬: CSS μ μ²λ¦¬κΈ°λ λ³μ, λ―Ήμ€μΈ, μ€μ²©μ μ¬μ©νμ¬ λ 체κ³μ μ΄κ³ λμ μΈ μ€νμΌμνΈλ₯Ό κ°λ₯νκ² ν©λλ€. λΉλ νμ΄νλΌμΈμ μΌλ°μ μΌλ‘ μ΄λ¬ν μ μ²λ¦¬κΈ° νμΌμ νμ€ CSSλ‘ μ»΄νμΌν©λλ€.
- μ€μ CSS μΆμΆ(Critical CSS Extraction): μ΄ κ³ κΈ κΈ°μ μ νμ΄μ§μ μ΄κΈ° λ λλ§ μμ(above-the-fold) μ½ν μΈ λ₯Ό λ λλ§νλ λ° νμν CSSλ₯Ό μλ³νκ³ μΈλΌμΈμΌλ‘ μ½μ νλ κ²μ ν¬ν¨ν©λλ€. λλ¨Έμ§ CSSλ λΉλκΈ°μ μΌλ‘ λ‘λλ©λλ€. μ΄λ λΈλΌμ°μ κ° λ³΄μ΄λ μ½ν μΈ λ₯Ό ν¨μ¬ λΉ λ₯΄κ² λ λλ§ν μ μκ² νμ¬ μΈμ§ μ±λ₯μ κ·Ήμ μΌλ‘ ν₯μμν΅λλ€. `critical`κ³Ό κ°μ λκ΅¬κ° μ΄ νλ‘μΈμ€λ₯Ό μλνν μ μμ΅λλ€. λ¨λ―Έμ μ¬μ©μκ° κ·νμ μ μμκ±°λ μ¬μ΄νΈλ₯Ό μ΄ λλ₯Ό μμν΄ λ³΄μΈμ. λΉ νλ©΄ λμ μ£Όμ μ ν μ 보μ λ μ΄μμμ μ¦μ 보λ κ²μ΄ ν¨μ¬ λ λ§€λ ₯μ μ λλ€.
- μ¬μ©νμ§ μλ CSS μ κ±°: PurgeCSSμ κ°μ λꡬλ HTML λ° JavaScript νμΌμ μ€μΊνμ¬ μ¬μ©λμ§ μλ CSS κ·μΉμ μ κ±°ν μ μμ΅λλ€. μ΄λ νΉν μ€νμΌλ§μ΄ κ΄λ²μν νλ‘μ νΈμμ CSS νμΌ ν¬κΈ°λ₯Ό ν¬κ² μ€μΌ μ μμ΅λλ€.
3. μ΄λ―Έμ§ μ΅μ ν
μ΄λ―Έμ§λ μ’ μ’ μΉνμ΄μ§μ μ΄ μ©λμ κ°μ₯ ν° κΈ°μ¬λ₯Ό ν©λλ€. ν¨κ³Όμ μΈ μ΅μ νλ νμμ μ λλ€.
- μμ€ μμΆ vs. 무μμ€ μμΆ: μμ€ μμΆ(JPEG λ±)μ μΌλΆ λ°μ΄ν°λ₯Ό λ²λ € νμΌ ν¬κΈ°λ₯Ό μ€μ΄λ λ°λ©΄, 무μμ€ μμΆ(PNG λ±)μ λͺ¨λ μλ³Έ λ°μ΄ν°λ₯Ό 보쑴ν©λλ€. μ΄λ―Έμ§ μ½ν μΈ μ λ°λΌ μ μ ν νμκ³Ό μμΆ μμ€μ μ ννμΈμ. μ¬μ§μ κ²½μ° νμ§ μ€μ μ΄ 70-85μΈ JPEGκ° μ’ μ’ μ’μ κ· νμ μ΄λ£Ήλλ€. ν¬λͺ λλ λ μΉ΄λ‘μ΄ μ μ΄ μλ κ·Έλν½μ κ²½μ° PNGκ° λ λμ μ μμ΅λλ€.
- μ°¨μΈλ νμ: JPEG λ° PNGμ λΉν΄ μ°μν μμΆλ₯ κ³Ό νμ§μ μ 곡νλ WebPμ κ°μ μ΅μ μ΄λ―Έμ§ νμμ νμ©νμΈμ. λλΆλΆμ μ΅μ λΈλΌμ°μ λ WebPλ₯Ό μ§μν©λλ€. λΉλ νμ΄νλΌμΈμ ꡬμ±νμ¬ μ΄λ―Έμ§λ₯Ό WebPλ‘ λ³ννκ±°λ `
` μμλ₯Ό μ¬μ©νμ¬ λ체 μ΄λ―Έμ§λ‘ μ 곡ν μ μμ΅λλ€. μ΄λ μ°κ²° μλκ° λλ¦° μ¬μ©μκ° λ μμ νμΌ ν¬κΈ°λ‘λΆν° ν° μ΄μ μ μ»μ μ μμΌλ―λ‘ μ μΈκ³μ μΈ μ΄μ μ λλ€. - λ°μν μ΄λ―Έμ§: `
` μμμ `srcset` λ° `sizes` μμ±μ μ¬μ©νμ¬ μ¬μ©μμ λ·°ν¬νΈ λ° μ₯μΉ ν΄μλμ λ°λΌ λ€λ₯Έ μ΄λ―Έμ§ ν¬κΈ°λ₯Ό μ 곡νμΈμ. μ΄λ κ² νλ©΄ μΌλ³Έμ λͺ¨λ°μΌ μ¬μ©μκ° κ±°λν λ°μ€ν¬ν± ν¬κΈ°μ μ΄λ―Έμ§λ₯Ό λ€μ΄λ‘λνλ κ²μ λ°©μ§ν μ μμ΅λλ€. - μ§μ° λ‘λ©(Lazy Loading): μ΄κΈ° λ λλ§ μμ μλμ μλ μ΄λ―Έμ§μ λν΄ μ§μ° λ‘λ©μ ꡬννμΈμ. μ¦, μ¬μ©μκ° μ€ν¬λ‘€νμ¬ λ³Ό λλ§ μ΄λ―Έμ§κ° λ‘λλλ―λ‘ μ΄κΈ° νμ΄μ§ λ‘λ μκ°μ΄ ν¬κ² λ¨μΆλ©λλ€. μ΄μ λ€μ΄ν°λΈ λΈλΌμ°μ μ§μ° λ‘λ© μ§μμ΄ λ리 보κΈλμμ΅λλ€(`loading="lazy"` μμ±).
- SVG μ΅μ ν: SVG(Scalable Vector Graphics)λ λ‘κ³ , μμ΄μ½ λ° μΌλ¬μ€νΈλ μ΄μ μ μ΄μμ μ λλ€. ν΄μλμ λ 립μ μ΄λ©° μ’ μ’ λμ€ν° μ΄λ―Έμ§λ³΄λ€ μμ μ μμ΅λλ€. λΆνμν λ©νλ°μ΄ν°λ₯Ό μ κ±°νκ³ κ²½λ‘μ 볡μ‘μ±μ μ€μ¬ SVGλ₯Ό μ΅μ ννμΈμ.
4. κΈκΌ΄ μ΅μ ν
μΉ κΈκΌ΄μ μ¬μ΄νΈμ μκ°μ λ§€λ ₯μ ν₯μμν€μ§λ§, μ μ€νκ² κ΄λ¦¬νμ§ μμΌλ©΄ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
- κΈκΌ΄ μλΈμΈν (Font Subsetting): κΈκΌ΄ νμΌμμ μ€μ λ‘ νμν λ¬Έμμ κΈλ¦¬νλ§ ν¬ν¨νμΈμ. μ ν리μΌμ΄μ μ΄ μ£Όλ‘ λΌν΄ λ¬Έμλ₯Ό μ¬μ©νλ κ²½μ°, ν€λ¦΄ λ¬Έμ, κ·Έλ¦¬μ€ λ¬Έμ λλ κΈ°ν λ¬Έμ μΈνΈλ₯Ό μ μΈνλλ‘ κΈκΌ΄μ μλΈμΈν νλ©΄ νμΌ ν¬κΈ°λ₯Ό ν¬κ² μ€μΌ μ μμ΅λλ€. μ΄λ λ¬Έμ μΈνΈκ° λ§€μ° λ€μν κΈλ‘λ² μ¬μ©μλ₯Ό μν ν΅μ¬ κ³ λ € μ¬νμ λλ€.
- μ΅μ κΈκΌ΄ νμ: WOFF λ° TTFμ κ°μ μ΄μ νμλ³΄λ€ μ°μν μμΆμ μ 곡νλ WOFF2μ κ°μ μ΅μ κΈκΌ΄ νμμ μ¬μ©νμΈμ. μ΄μ λΈλΌμ°μ λ₯Ό μν΄ λ체 νμμ μ 곡νμΈμ.
- Font Display μμ±: `font-display` CSS μμ±μ μ¬μ©νμ¬ κΈκΌ΄μ΄ λ‘λλκ³ λ λλ§λλ λ°©μμ μ μ΄νμΈμ. `font-display: swap;`μ΄ μ’ μ’ κΆμ₯λλλ°, μ΄λ μ¬μ©μ μ§μ κΈκΌ΄μ΄ λ‘λλλ λμ λ체 κΈκΌ΄μ μ¦μ νμνμ¬ λ³΄μ΄μ§ μλ ν μ€νΈ(FOIT)λ₯Ό λ°©μ§νκΈ° λλ¬Έμ λλ€.
λΉλ νμ΄νλΌμΈμ μ΅μ ν ν΅ν©νκΈ°
μ΄λ¬ν κΈ°μ μ΄ μΈκΈ° μλ λΉλ λꡬλ₯Ό μ¬μ©νμ¬ μ€μ λ‘ μ΄λ»κ² ꡬνλλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μΈκΈ° μλ λΉλ λꡬμ κ·Έ μν
- Webpack: κ³ λλ‘ κ΅¬μ± κ°λ₯ν λͺ¨λ λ²λ€λ¬μ λλ€. κ΄λ²μν νλ¬κ·ΈμΈ μνκ³μ κ°μ μ΄ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ μ΅μν, νΈλμ€νμΌλ§, μ΄λ―Έμ§ μ΅μ ν, μ½λ λΆν λ±μ μνν μ μμ΅λλ€.
- Rollup: ν¨μ¨μ μΈ ES λͺ¨λ λ²λ€λ§κ³Ό νΈλ¦¬ μμ΄νΉ κΈ°λ₯μΌλ‘ μ λͺ ν©λλ€. λΌμ΄λΈλ¬λ¦¬ λ° μκ·λͺ¨ μ ν리μΌμ΄μ μ μ’ μ’ μ νΈλ©λλ€.
- Parcel: λ§μ κΈ°λ₯μ μ¦μ μ§μνλ μ λ‘ κ΅¬μ± λ²λ€λ¬λ‘, μ΄λ³΄μμκ² λ§€μ° μΉμν©λλ€.
- Vite: κ°λ° μ€ λ€μ΄ν°λΈ ES λͺ¨λμ νμ©νμ¬ λ§€μ° λΉ λ₯Έ HMR(Hot Module Replacement)μ μ 곡νκ³ νλ‘λμ λΉλμλ Rollupμ μ¬μ©νλ μλ‘μ΄ λΉλ λꡬμ λλ€.
Webpackμ μ¬μ©ν μμ μν¬νλ‘μ°
μ΅μ νλ‘ νΈμλ νλ‘μ νΈλ₯Ό μν μΌλ°μ μΈ Webpack ꡬμ±μλ λ€μμ΄ ν¬ν¨λ μ μμ΅λλ€:
- μ§μ μ (Entry Points): μ ν리μΌμ΄μ μ μ§μ μ μ μ μν©λλ€(μ: `src/index.js`).
- λ‘λ(Loaders): λ€μν νμΌ μ νμ μ²λ¦¬νκΈ° μν΄ λ‘λλ₯Ό μ¬μ©ν©λλ€:
- JavaScript νΈλμ€νμΌλ§μ μν `babel-loader`.
- CSS μ²λ¦¬λ₯Ό μν `css-loader` λ° `style-loader` (λλ `mini-css-extract-plugin`).
- Sass μ»΄νμΌμ μν `sass-loader`.
- μ΄λ―Έμ§ μ²λ¦¬λ₯Ό μν `image-minimizer-webpack-plugin` λλ `url-loader`/`file-loader`.
- νλ¬κ·ΈμΈ(Plugins): κ³ κΈ μμ μ μν΄ νλ¬κ·ΈμΈμ νμ©ν©λλ€:
- μ€ν¬λ¦½νΈμ μ€νμΌμ΄ μ½μ λ HTML νμΌμ μμ±νλ `HtmlWebpackPlugin`.
- CSSλ₯Ό λ³λμ νμΌλ‘ μΆμΆνλ `MiniCssExtractPlugin`.
- JavaScript μ΅μνλ₯Ό μν `TerserWebpackPlugin`.
- CSS μ΅μνλ₯Ό μν `CssMinimizerPlugin`.
- μ μ μμ°μ 볡μ¬νλ `CopyWebpackPlugin`.
- μ½λ λΆν μ μν `webpack.optimize.SplitChunksPlugin`.
- μΆλ ₯ ꡬμ±(Output Configuration): λ²λ€λ μμ°μ μΆλ ₯ λλ ν 리μ νμΌ μ΄λ¦ ν¨ν΄μ μ§μ ν©λλ€. μΊμ 무λ ₯νλ₯Ό μν΄ μ½ν μΈ ν΄μ±μ μ¬μ©ν©λλ€(μ: `[name].[contenthash].js`).
Webpack κ΅¬μ± μμ μ€λν« (κ°λ μ ):
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: '[name].[contenthash].js',
path: __dirname + '/dist',
clean: true,
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
],
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css',
}),
],
optimization: {
minimize: true,
minimizer: [
new TerserPlugin(),
new CssMinimizerPlugin(),
],
splitChunks: {
chunks: 'all',
},
},
};
μΊμ± λ° μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN) νμ©
μμ°μ΄ μ²λ¦¬λκ³ μ΅μ νλ ν, μ μΈκ³ μ¬μ©μμκ² ν¨μ¨μ μΌλ‘ μ λ¬λλλ‘ νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
- λΈλΌμ°μ μΊμ±: HTTP ν€λ(μ: `Cache-Control` λ° `Expires`)λ₯Ό ꡬμ±νμ¬ λΈλΌμ°μ κ° μ μ μμ°μ μΊμνλλ‘ μ§μν©λλ€. μ΄λ μμ°μ΄ μ¬μ©μμ λ‘컬 μΊμμμ μ 곡λλ―λ‘ μ¬μ΄νΈ μ¬λ°©λ¬Έ μ λ‘λ μλκ° ν¨μ¬ λΉ¨λΌμ§λ€λ κ²μ μλ―Έν©λλ€.
- μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN): CDNμ λ€μν μ§λ¦¬μ μμΉμ μλ λΆμ°λ μλ² λ€νΈμν¬μ λλ€. CDNμμ μμ°μ μ 곡ν¨μΌλ‘μ¨ μ¬μ©μλ 물리μ μΌλ‘ λ κ°κΉμ΄ μλ²μμ μμ°μ λ€μ΄λ‘λνμ¬ λκΈ° μκ°μ ν¬κ² μ€μΌ μ μμ΅λλ€. μΈκΈ° μλ CDNμΌλ‘λ Cloudflare, Akamai, AWS CloudFrontκ° μμ΅λλ€. λΉλ κ²°κ³Όλ¬Όμ CDNκ³Ό ν΅ν©νλ κ²μ κΈλ‘λ² μ±λ₯μ μν μ€μν λ¨κ³μ λλ€. μλ₯Ό λ€μ΄, λ―Έκ΅ μλ²μμ νΈμ€ν λλ μ¬μ΄νΈμ μ μνλ μΊλλ€ μ¬μ©μλ ν΄λΉ μμ°μ΄ μΊλλ€μ CDN λ Έλλ₯Ό ν΅ν΄μλ μ 곡λ λ ν¨μ¬ λΉ λ₯Έ μμ° μ λ¬μ κ²½νν μ μμ΅λλ€.
- μΊμ 무λ ₯ν μ λ΅: μμ° νμΌ μ΄λ¦μ κ³ μ ν ν΄μ(λΉλ λꡬμ μν΄ μμ±λ¨)λ₯Ό μΆκ°νλ©΄(μ: `app.a1b2c3d4.js`), μμ°μ μ λ°μ΄νΈν λλ§λ€ νμΌ μ΄λ¦μ΄ λ³κ²½λ©λλ€. μ΄λ λΈλΌμ°μ κ° μ€λλ μΊμ νμΌμ 무μνκ³ μ λ²μ μ λ€μ΄λ‘λνλλ‘ κ°μ νλ λμμ, μ΄μ μ μΊμλ λ²μ μ κ³ μ ν μ΄λ¦ λλΆμ κ³μ μ ν¨ν©λλ€.
μ±λ₯ μμ° λ° μ§μμ μΈ λͺ¨λν°λ§
μ΅μ νλ μΌνμ± μμ μ΄ μλλΌ μ§μμ μΈ νλ‘μΈμ€μ λλ€.
- μ±λ₯ μμ° μ μ: νμ΄μ§ λ‘λ μκ°, μ΅μ΄ μ½ν μΈ νμΈνΈ(FCP), μ΅λ μ½ν μΈ νμΈνΈ(LCP), μ΄ μ°¨λ¨ μκ°(TBT)κ³Ό κ°μ μ§νμ λν λͺ νν λͺ©νλ₯Ό μ€μ ν©λλ€. μ΄λ¬ν μμ°μ κ°λ° νλ‘μΈμ€μ κ°λλ μΌ μν μ ν©λλ€.
- CI/CDμ μ±λ₯ ν μ€νΈ ν΅ν©: μ§μμ ν΅ν©/μ§μμ λ°°ν¬(CI/CD) νμ΄νλΌμΈ λ΄μμ μ±λ₯ κ²μ¬λ₯Ό μλνν©λλ€. Lighthouse CI λλ WebPageTestμ κ°μ λꡬλ₯Ό ν΅ν©νμ¬ μ±λ₯ μ§νκ° μ¬μ μ μλ μκ³κ° μλλ‘ λ¨μ΄μ§λ©΄ λΉλλ₯Ό μ€ν¨μν¬ μ μμ΅λλ€. μ΄ μ¬μ μλ°©μ μ κ·Ό λ°©μμ μ±λ₯ μ νκ° νλ‘λμ μ λλ¬νκΈ° μ μ μ‘μλ΄λ λ° λμμ΄ λλ©°, μΌκ΄λ κΈλ‘λ² μ±λ₯μ μ μ§νλ λ° νμμ μ λλ€.
- μ€μ μ¬μ©μ μ±λ₯ λͺ¨λν°λ§(RUM): μ€μ μ¬μ©μ λͺ¨λν°λ§(RUM) λꡬλ₯Ό ꡬννμ¬ λ€μν μ₯μΉ, λΈλΌμ°μ λ° μ§λ¦¬μ μμΉμ κ±Έμ³ μ€μ μ¬μ©μλ‘λΆν° μ±λ₯ λ°μ΄ν°λ₯Ό μμ§ν©λλ€. μ΄λ μ΅μ νκ° μ€μ νκ²½μμ μ΄λ»κ² μνλκ³ μλμ§μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, RUM λ°μ΄ν°λ νΉμ μ§μμ μ¬μ©μκ° λΉμ μμ μΌλ‘ λλ¦° μ΄λ―Έμ§ λ‘λ©μ κ²½ννκ³ μμμ 보μ¬μ€ μ μμΌλ©°, μ΄λ ν΄λΉ μ§μμ μμ° μ λ¬ λλ CDN ꡬμ±μ λν μΆκ° μ‘°μ¬λ₯Ό μ΄λ°ν μ μμ΅λλ€.
κ³ λ €ν΄μΌ ν λꡬ λ° κΈ°μ
νλ‘ νΈμλ μνκ³λ λμμμ΄ μ§ννκ³ μμ΅λλ€. μ΅μ λꡬλ₯Ό κ³μ μ λ°μ΄νΈνλ©΄ λΉλ νμ΄νλΌμΈμ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- λͺ¨λ λ²λ€λ¬: Webpack, Rollup, Parcel, Vite.
- νΈλμ€νμΌλ¬: Babel, SWC (Speedy Web Compiler).
- μ΅μν λꡬ: Terser, CSSNano, esbuild.
- μ΄λ―Έμ§ μ΅μ ν λꡬ: ImageMin, imagify, squoosh.app (μλ λλ νλ‘κ·Έλλ° λ°©μ μ΅μ νμ©).
- λ¦°ν° & ν¬λ§€ν°: ESLint, Prettier (μ½λ νμ§ μ μ§μ λμμ μ£Όμ΄ λ³΅μ‘μ±μ μ€μ¬ κ°μ μ μΌλ‘ μ±λ₯μ μν₯μ λ―ΈμΉ¨).
- μ±λ₯ ν μ€νΈ λꡬ: Lighthouse, WebPageTest, GTmetrix.
κΈλ‘λ² νλ‘ νΈμλ μ±λ₯μ μν λͺ¨λ² μ¬λ‘
μ΅μ νλ νλ‘ νΈμλκ° μ μΈκ³ μ¬μ©μλ₯Ό λ§μ‘±μν€λλ‘ νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμΈμ:
- μ΄κΈ° λ λλ§ μμ μ½ν μΈ μ°μ μμ μ§μ : μ΄κΈ° λ·°ν¬νΈμ λν μ€μν μ½ν μΈ μ μ€νμΌμ΄ κ°λ₯ν ν 빨리 λ‘λλλλ‘ ν©λλ€.
- λͺ¨λ°μΌ μ°μ μ΅μ ν: λͺ¨λ°μΌ μ₯μΉλ μ’ μ’ κΈλ‘λ² μ¬μ©μ κΈ°λ°μ μλΉ λΆλΆμ μ°¨μ§νλ©° λ€νΈμν¬ μ‘°κ±΄μ΄ λ μ νμ μΌ μ μμΌλ―λ‘ λͺ¨λ°μΌ μ₯μΉλ₯Ό μν΄ μ€κ³νκ³ μ΅μ νν©λλ€.
- μ€μνμ§ μμ 리μμ€ μ§μ° λ‘λ©: μ¬μ©μμκ² μ¦μ 보μ΄μ§ μλ JavaScript, μ΄λ―Έμ§ λ° κΈ°ν μμ°μ λ‘λ©μ μ§μ°ν©λλ€.
- μ 3μ μ€ν¬λ¦½νΈ μ΅μν: μΈλΆ μ€ν¬λ¦½νΈ(λΆμ, κ΄κ³ , μμ ―)λ λ‘λ μκ°μ ν° μν₯μ μ€ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©ν©λλ€. λ‘λ© μ λ΅μ κ°μ¬νκ³ μ΅μ νν©λλ€.
- μλ² μ¬μ΄λ λ λλ§(SSR) λλ μ μ μ¬μ΄νΈ μμ±(SSG): μ½ν μΈ κ° λ§μ μ¬μ΄νΈμ κ²½μ° SSR λλ SSGλ 미리 λ λλ§λ HTMLμ μ 곡νμ¬ μ΄κΈ° λ‘λ μκ°κ³Ό SEOλ₯Ό κ°μ ν¨μΌλ‘μ¨ μλΉν μ±λ₯ ν₯μμ μ 곡ν μ μμ΅λλ€. Next.js λ° Nuxt.jsμ κ°μ νλ μμν¬κ° μ΄ λΆμΌμμ λ°μ΄λ©λλ€.
- μ κΈ°μ μΈ κ°μ¬ λ° λ¦¬ν©ν λ§: μ£ΌκΈ°μ μΌλ‘ λΉλ νλ‘μΈμ€μ μ½λλ₯Ό κ²ν νμ¬ κ°μ ν λΆλΆμ μ°Ύμ΅λλ€. μ ν리μΌμ΄μ μ΄ μ±μ₯ν¨μ λ°λΌ μ±λ₯ λ³λͺ© νμμ κ°λ₯μ±λ 컀μ§λλ€.
κ²°λ‘
μ격ν μμ° μ²λ¦¬ λ° μ΅μ νμ μ΄μ μ λ§μΆ μ μ€κ³λ νλ‘ νΈμλ λΉλ νμ΄νλΌμΈμ λ¨μν κΈ°μ μ μΈ μΈλΆ μ¬νμ΄ μλλΌ νμν μ¬μ©μ κ²½νμ μ 곡νλ κ·Όλ³Έμ μΈ κΈ°λ₯μ λλ€. νλμ μΈ λꡬλ₯Ό μμ©νκ³ , μ λ΅μ μΈ μ΅μ ν κΈ°μ μ μ±ννλ©°, μ§μμ μΈ λͺ¨λν°λ§μ μ λ ν¨μΌλ‘μ¨ μΉ μ ν리μΌμ΄μ μ΄ μ μΈκ³ μ¬μ©μμκ² λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ©° μ κ·Ό κ°λ₯νλλ‘ λ³΄μ₯ν μ μμ΅λλ€. λ°λ¦¬μ΄κ° μ€μν μΈμμμ μ±λ₯μ΄ λ°μ΄λ νλ‘ νΈμλλ κ²½μ μ°μμ΄λ©°, μ¬μ©μ λ§μ‘±λλ₯Ό λμ΄κ³ λΉμ¦λμ€ μ±κ³΅μ μ΄λμ΄λ λλ€.